Skip to content

fix: align rtl toolbar state and alignment writes with ooxml bidi#3244

Merged
caio-pizzol merged 4 commits into
mainfrom
artem/rtl-v10
May 12, 2026
Merged

fix: align rtl toolbar state and alignment writes with ooxml bidi#3244
caio-pizzol merged 4 commits into
mainfrom
artem/rtl-v10

Conversation

@artem-harbour
Copy link
Copy Markdown
Contributor

@artem-harbour artem-harbour commented May 12, 2026

Linear: SD-3094

Fixes RTL paragraph alignment parity across toolbar state and alignment commands.

What changed

  • Added shared alignment mapper for RTL-aware conversion:
    • display alignment ↔ stored OOXML justification (left/right mirroring for RTL, justifyboth).
  • Updated toolbar text-align state derivation to use resolved paragraph properties and show visual alignment correctly for RTL paragraphs.
  • Updated setTextAlign command to:
    • resolve paragraph ancestor reliably (even when selection parent is run),
    • use resolved rightToLeft,
    • write mirrored OOXML justification for RTL.
  • Applied the same RTL-aware mapping in Document API alignment paths (paragraphsSetAlignmentWrapper, style.apply/spanStyle.apply executor logic).

Result

  • Toolbar state now matches Word-style visual alignment for RTL docs.
  • Toolbar buttons and shortcuts (Mod-Shift-L/R) apply expected visual alignment in RTL paragraphs.
  • Alignment behavior is consistent across UI commands and Document API mutations.

Related: #3235

@codecov-commenter
Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 66fe33d6ff

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

@artem-harbour artem-harbour requested a review from harbournick May 12, 2026 16:53
@linear
Copy link
Copy Markdown

linear Bot commented May 12, 2026

SD-3094

…i export

Adds three coverage layers for the SD-3094 writer-side mirror:

- paragraph-alignment unit (23 tests): direct coverage of the new helper
  pair (mapDisplayAlignmentToStoredJustification +
  mapStoredJustificationToDisplayAlignment), including the absent-value
  default and a display->stored->display roundtrip for every alignment.
- Toolbar behavior (4 tests): clicking each align button on an RTL
  paragraph writes the expected mirrored OOXML justification (verified
  via the doc-api).
- Doc-API story (5 tests): format.paragraph.setAlignment on an RTL
  paragraph exports the expected w:jc value (left->right, right->left,
  center->center, justify->both); LTR baseline unchanged.

Fixture rtl-paragraph-alignment.docx is duplicated from the SD-3093
behavior tests so this PR's CI can run standalone; it will collapse to
the SD-3093 copy when the two PRs merge.
…6.1)

Adds regression coverage for the spec rule that section-level w:bidi
must NOT cascade to paragraph w:jc interpretation. Section bidi affects
only section-level properties (page numbers, columns), not paragraph
alignment.

The fixture has a section with <w:bidi/> but two paragraphs without
paragraph-level <w:bidi/>. Tests verify that clicking Align Left or
Align Right on these paragraphs stores the display value unchanged
(no mirror), since the paragraph itself is LTR per spec.
…n, and indent

Expands SD-3094 behavior coverage across additional surfaces that share
the alignment-writer code path:

- Headings (Heading1/Heading2 with w:bidi): Align Left/Right mirrors
  the stored OOXML the same way it does for body paragraphs.
- Table cells with RTL direction (w:bidiVisual): Align Left on a
  Hebrew cell paragraph stores w:jc=right.
- Multi-paragraph selection across three RTL paragraphs: Align Left
  applies the writer mirror per-paragraph, all three end up stored
  as w:jc=right.
- Indent + RTL: Increase Indent on an RTL paragraph updates the
  paragraph properties (smoke test against the toolbar indent button).

Lists + RTL alignment was investigated but deferred: it needs a
hand-crafted OOXML fixture with explicit numbering + paragraph-level
bidi, which is a bigger scope and better tracked separately.
Copy link
Copy Markdown
Contributor

@caio-pizzol caio-pizzol left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hey @artem-harbour - i pushed three test commits on yours: the round-1 ones i flagged, section-only rtl (§17.6.1), and coverage for headings, rtl tables, multi-paragraph selection, and indent.

tested the full flow live on main + this PR: clicking align saves the right value and renders correctly.

lgtm.

@caio-pizzol caio-pizzol enabled auto-merge (squash) May 12, 2026 23:12
@caio-pizzol caio-pizzol merged commit 766f82e into main May 12, 2026
65 checks passed
@caio-pizzol caio-pizzol deleted the artem/rtl-v10 branch May 12, 2026 23:30
@superdoc-bot
Copy link
Copy Markdown
Contributor

superdoc-bot Bot commented May 12, 2026

🎉 This PR is included in @superdoc-dev/mcp v0.3.0-next.82

The release is available on GitHub release

@superdoc-bot
Copy link
Copy Markdown
Contributor

superdoc-bot Bot commented May 12, 2026

🎉 This PR is included in @superdoc-dev/react v1.2.0-next.125

The release is available on GitHub release

@superdoc-bot
Copy link
Copy Markdown
Contributor

superdoc-bot Bot commented May 12, 2026

🎉 This PR is included in vscode-ext v2.3.0-next.127

@superdoc-bot
Copy link
Copy Markdown
Contributor

superdoc-bot Bot commented May 12, 2026

🎉 This PR is included in superdoc-cli v0.8.0-next.99

The release is available on GitHub release

@superdoc-bot
Copy link
Copy Markdown
Contributor

superdoc-bot Bot commented May 12, 2026

🎉 This PR is included in superdoc-sdk v1.8.0-next.81

@superdoc-bot
Copy link
Copy Markdown
Contributor

superdoc-bot Bot commented May 12, 2026

🎉 This PR is included in superdoc v1.30.0-next.81

The release is available on GitHub release

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants